package com.example.springframework.beans.factory.support;

import com.example.springframework.beans.factory.config.SingletonBeanRegistry;

import java.util.HashMap;
import java.util.Map;

/**
 * @fileName: {@link DefaultSingletonBeanRegistry}
 * @author: yyfl
 * @date: 2023/2/23 14:53
 * @description:
 * @history:
 *
 * 主要作用是：实现了最基础的获取Bean 和 保存Bean的方法
 *      1、注册单例
 *      2、获取单例Bean实现
 *
 * 单例 SingletonBeanRegistry 的接口定义实现，
 * 而 DefaultSingletonBeanRegistry 对接口实现后，
 * 会被抽象类 AbstractBeanFactory 继承。现在 AbstractBeanFactory 就是一个非常完整且强大的抽象类了
 *
 * 在 DefaultSingletonBeanRegistry 中实现了一个受保护的 addSingletonBean 方法，这个方法实现了保存Bean实例的逻辑
 * 这个方法可以被其他继承了 DefaultSingletonBeanRegistry 的类调用 包括 AbstractBeanFactory
 *
 */
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {

    /**
     * 单例模式
     * 定义一个哈希桶进行存储Bean实例
     */
    private Map<String, Object> singletonObjects = new HashMap<>();

    /**
     * 实现获取一个单例对象的接口
     *
     * @param beanName 单例对象的类名称
     * @return 实例对象
     */
    @Override
    public Object getSingleton(String beanName) {
        return singletonObjects.get(beanName);
    }

    /**
     * 保存Bean对象的实例
     *
     * @param beanName 实例类名称
     * @param singletonObject 实例对象
     */
    protected void addSingletonBean(String beanName, Object singletonObject){
        singletonObjects.put(beanName, singletonObject);
    }
}
